package com.yixiu.study.juc.taobao.num3;

/**
 * @CalssName T03_SyncWaitNotify_CAS
 * @Description
 * @Author yixiu
 * @Date 2021/6/29 10:07
 * @Verison 1.0
 **/
public class T03_SyncWaitNotify_CAS {

    private static volatile boolean t2Started = false;

    public static void main(String[] args) {
        final Object o = new Object();

        char[] aI = "1234567".toCharArray();
        char[] aC = "ABCDEFG".toCharArray();


        new Thread(() -> {
            synchronized (o){
                while (!t2Started){
                    try {
                        o.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }


                for(char c : aI){
                    System.out.println(c);

                    try {
                        o.notify();
                        //因为 notify() 不会释放锁，所以需要调用一次 wait() 方法来释放当前持有的锁
                        o.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

                //最后必须执行这个，不然程序无法正常停止
                o.notify();
            }
        }, "t1").start();


        new Thread(() -> {
            synchronized (o){
                for(char c : aC){
                    System.out.println(c);
                    t2Started = true;
                    try {
                        o.notify();
                        //因为 notify() 不会释放锁，所以需要调用一次 wait() 方法来释放当前持有的锁
                        o.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

                //最后必须执行这个，不然程序无法正常停止
                o.notify();
            }
        }, "t2").start();
    }

}
